<html>
    <head>
        <title>连接字符串</title>
    </head>
    <body>
        <script>
            // 连接字符串   Connection String
                  /*
                        当你想要创建或使用模块化系统时，特别需要连接字符串系统。
                        如果你有一个带有单个数据库的单体应用程序，你可以直接使用为你配置的 "ABP启动解决方案"。


                        ABP被设计为 "模块化" 和 "多租户感知"。连接字符串管理也旨在支持这些场景：

                            1、允许为每个模块设置单独的链接字符串，因此每个模块都可以有自己的"物理数据库"。模块设置可以被配置为不同的数据库提供程序。

                            2、允许设置单独的连接字符串并为每个租户使用单独的数据库 （在SaaS（软件即服务，不再单独部署，多租户，只提供服务）））

                        它还支持混合场景：
                            1、允许将模块分组到数据库中（例如，将所有模块分组到一个共享数据库，或者两个模块到数据库A，三个模块到数据库B，一个模块到数据库C，其余模块到数据库D）

                            2、允许将租户分组到数据库中，就像模块一样。

                            3、允许将每个租户的每个模块的数据库分开。（由于数据库可能很多，你可能很难维护，单ABP支持它）

                        所有与构建的应用程序模块都旨在兼容这些场景。
                  */

                  /*
                      一、配置连接字符串

                            "ConnectionStrings": {
                                    "Default": "Server=localhost;Database=MyMainDb;Trusted_Connection=True;",
                                    "AbpIdentityServer": "Server=localhost;Database=MyIdsDb;Trusted_Connection=True;",
                                    "AbpPermissionManagement": "Server=localhost;Database=MyPermissionDb;Trusted_Connection=True;"
                            }
                            ABP 使用IConfiguration服务来获取应用程序配置。
                            虽然将配置写入 appsettings.json 文件是最简单的方法，但它的配置不仅限于该文件。你可以使用环境变量、用户机密、Azure Key Vault…等。

                            此配置定义了三个不同的链接字符串：
                                ①、MyMainDb （Default连接字符串） 是应用程序的主要连接字符串。如果你没有为模块指定链接字符串，他会回退到 Default 连接字符串。
                                                                 应用程序启动模板配置为使用单个连接字符串，因此所有模块都使用单个共享数据库。
                                ②、MyIdsDb (AbpIdentityServer 连接字符串) 由IdentityServer模块使用。

                                ③、MyPermissionDb (AbpPermissionManagement 连接字符串) 由权限管理模块使用。

                                预构建的应用程序模块为连接字符串名称定义常量。
                                例如，IdtyServer模块在AbpIdentityServerDbProperties类中定义了一个ConnectionStringName常量（位于Volo.Abp.IdentityServer命名空间中）。
                                其他模块类似地定义常量，因此你可以研究连接字符串名称。
                  */


                  /*
                     二、AbpDbConnectionOptions abp连接字符串配置项

                                AbpDbConnectionOptions是用于"设置连接字符串"和 "配置数据库结构" 的选项类、


                                1、设置连接字符串
                                        ABP使用 AbpDbConnectionOptions 来获取连接字符串。
                                        如果你如上述方式配置连接字符串(appsetting.json), AbpDbConnectionOptions 会自动填充。
                                        但是，你可以使用"选项模式" 来设置或覆盖链接字符串。

                                        你可以在模块的 ConfigureServices 方法中配置 AbpDbConnectionOptions.

                                            public override void ConfigureServices(ServiceConfigurationContext context)
                                            {
                                                Configure<AbpDbConnectionOptions>(options =>
                                                {
                                                    options.ConnectionStrings.Default = "...";  // 覆盖默认连接字符串

                                                    options.ConnectionStrings["AbpPermissionManagement"] = "..."; // 覆盖“权限管理模块”的连接字符串
                                                });
                                            }
                                2、配置数据库结构
                                        AbpDbConnectionOptions类的 Databases 属性用于将多个链接字符串（多个模块），分组为单个链接字符串。

                                        例如，以下链接字符串配置：

                                            "ConnectionStrings": {
                                                "Default": "Server=localhost;Database=MyMainDb;Trusted_Connection=True;",
                                                "AbpIdentity": "Server=localhost;Database=MySecondaryDb;Trusted_Connection=True;",
                                                "AbpIdentityServer": "Server=localhost;Database=MySecondaryDb;Trusted_Connection=True;",
                                                "AbpPermissionManagement": "Server=localhost;Database=MySecondaryDb;Trusted_Connection=True;"
                                            }
                                             
                                        在此示例中，我们定义了四个连接字符串，但其中最后三个是相同的；
                                        AbpIdentity、AbpIdentityServer和AbpPermissionManagement使用相同的数据库，名为MySecondaryDb。
                                        主应用程序和其他模块使用Default连接字符串，因此是MyMainDb数据库。

                                        这里我们要做的是将三个模块（AbpIdentity、AbpIdentityServer和AbpPermissionManagement）分组在一个数据库中，
                                        但是我们需要手动指定每个模块。因为后备连接字符串是Default，如果我们不为模块指定它。

                                        为了消除重复的连接字符串定义，我们可以配置AbpDbConnectionOptions.Databases属性来对这些连接字符串进行分组：
                                            
                                                    // (在启动模块中)
                                                    Configure<AbpDbConnectionOptions>(options =>
                                                    {
                                                        // 配置模块连接字符串映射
                                                        options.Databases.Configure("MySecondaryDb", db =>
                                                        {
                                                            db.MappedConnections.Add("AbpIdentity"); // 映射AbpIdentity模块的连接字符串
                                                            db.MappedConnections.Add("AbpIdentityServer"); // 映射AbpIdentityServer模块的连接字符串
                                                            db.MappedConnections.Add("AbpPermissionManagement"); // 映射AbpPermissionManagement模块的连接字符串
                                                        });
                                                    });

                                        然后我们可以更改appsettings.json文件，如以下代码块所示:

                                                    "ConnectionStrings": {
                                                        "Default": "Server=localhost;Database=MyMainDb;Trusted_Connection=True;",
                                                        "MySecondaryDb": "Server=localhost;Database=MySecondaryDb;Trusted_Connection=True;"
                                                    }

                                                MySecondaryDb成为映射连接的新连接字符串。
                                        
                                        ABP首先查找特定于模块的连接字符串，然后查看数据库映射是否可用，最后回退到Default连接字符串。
                  */

                  /*
                        三、为数据库上下文类设置连接字符串名称

                                   模块通常使用 [ConnectionStringName]特性 将唯一的连接字符串名称关联到其DbContext类。
                                   
                                                        [ConnectionStringName("AbpIdentityServer")]
                                                        public class IdentityServerDbContext
                                                            : AbpDbContext<IdentityServerDbContext>, IIdentityServerDbContext
                                                        {

                                                        }
                                
                                    对于 EF Core 和 MongoDB ，将其写入你的 数据库上下文DbContext类中。这样，ABP为相关的DbContext实例使用指定的链接字符串。
                  */

                  /*
                        四、EF Core 数据库迁移

                                关系数据库需要在使用之前创建数据库和数据库模式(表、视图…等)。

                                启动模板使用带有单一数据库和一个 .EntityFrameworkCore项目，其中包含"相关的类"和 "该数据库的迁移文件".
                                该项目主要定义了一个 "YourProjectNameDbContext类"，该类调用所用模块的Configure...()方法，如builder.ConfigurePermissionManagement()。

                                一旦你想要分离模块的数据库，你通常需要创建第二个迁移路径。

                                请参阅EF Core Migrations文档以了解如何为所需模块创建和使用不同的数据库。
                  */

                  /*
                        五、多租户

                             请参阅多租户文档以了解如何为租户使用单独的数据库。
                  */
        </script>
    </body>
</html>